package com.frame.ar.hander;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;

import com.jfinal.kit.StrKit;

/**
 * 作用描述：解析企信消息配置文件
 * @author LRC
 * @createDate 2015年10月20日
 * @version v1.0 
 * @updateRecord 格式：时间，作者，修改说明
 **
 * 
 */
public class MessageXMLHander {
	
	/**
	 * model配置文件名
	 */
	private String fileName = "WeiXinMessage.cfg.xml";
	/**
	 * 单例对象
	 */
	private static MessageXMLHander config = new MessageXMLHander();
	
	public static MessageXMLHander getInstance(){
		return config;
	}
	/**
	 * 消息映射
	 */
	private Map<String,Message> messages;

	public MessageXMLHander(){
		try{
			messages = new HashMap<String,Message>();
			InputStream xml = MessageXMLHander.class.getClassLoader().getResourceAsStream(fileName);
			parse(xml);
		}catch(Exception e){
			throw new RuntimeException("加载Model配置文件错误",e);
		}
		
	}
	
	/**
	 * 功能描述：再解析
	 * @throws Exception 
	 * @createDate 2015年10月21日 by LRC 
	 * @updateRecord 格式：时间，作者，修改说明
	 **
	 * 
	 */
	public void parse() throws Exception{
		InputStream xml = MessageXMLHander.class.getClassLoader().getResourceAsStream(fileName);
		parse(xml);
	}

	/*******************************************
	 * 功能描述：解析配置文件
	 *******************************************
	 * @createDate 2015-9-11 by LRC
	 * @param xml
	 * @throws Exception 
	 * @updateRecord 格式：时间，作者，修改说明
	 *******************************************
	 * 
	 */
	public void parse(InputStream xml) throws Exception{
		messages.clear();
		//读取xml文件到document对象
		SAXReader reader = new SAXReader();
		Document doc = reader.read(xml);
		//查找message
		List<Element> emessages = doc.selectNodes("/messages/message");
		for(Element emessage : emessages){
			Attribute vId = emessage.attribute("id");
			if(vId!=null){
				Message message = new Message();
				message.id = vId.getValue();//设置消息id
				Attribute vName = emessage.attribute("name");
				message.name = vName!=null ? vName.getValue() : "";//设置消息名称
				
				//解析数据集
				List<Element> edatas = emessage.selectNodes("//message[@id='"+message.id+"']/datas/data");
				List<Data> datas = new ArrayList<Data>();
				if(edatas.size()!=0){
					for(Element edata : edatas){
						//获取类名
						Attribute aId = edata.attribute("id");
						if(aId!=null){
							Data data = new Data();
							data.id = aId.getValue();
							Attribute aName = edata.attribute("name");
							data.name=aName!=null ? aName.getValue() : "";//设置消息名称
							Attribute aRownum = edata.attribute("rownum");
							data.rownum= aRownum!=null ? Integer.parseInt(aRownum.getValue()) : 1;//设置消息名称
							Attribute aType = edata.attribute("type");
							data.type = aType!=null ? aType.getValue() : "db";
							if("db".equals(data.type)){
								//获取数据库查询sql
								data.sql =  edata.getText().trim();
								Attribute aDbSource = edata.attribute("dbSource");
								if(aDbSource!=null){
									data.dbSource = StrKit.isBlank(aDbSource.getValue()) ? "main" : aDbSource.getValue();
								}else{
									data.dbSource= "main";
								}
							}else if("list".equals(data.type)){
								Map<String,Object> _data = new HashMap<String,Object>();
								//获取数据列表
								List<Element> evalues = emessage.selectNodes("//message[@id='"+message.id+"']/datas/data[@id='"+data.id+"']/value");
								Integer index = 1;
								for(Element evalue : evalues){
									Attribute _aName = evalue.attribute("name");
									String _id = _aName!=null ? _aName.getValue() : index+"";
									_data.put(_id, evalue.getText());
									index++;
								}
								data.data = _data;
							}
							datas.add(data);
						}
					}
				};
				message.datas = datas;
				
				//解析表达式
				Node eexpress = emessage.selectSingleNode("//message[@id='"+message.id+"']/express");
				if(eexpress!=null){
					message.express = eexpress.getText().trim();
				}
				messages.put(message.id, message);
			}
		}
	}

	/**
	 * 消息
	 * @param dataSource
	 * @param className
	 * @return
	 */
	public Message getMessage(String id){
		Message message = this.messages.get(id);
		return message;
	}
	
	/**
	 * 作用描述：消息体
	 * @author LRC
	 * @createDate 2015年10月20日
	 * @version v1.0 
	 * @updateRecord 格式：时间，作者，修改说明
	 **
	 * 
	 */
	public class Message{
		public String id;
		public String name;
		public List<Data> datas;
		public String express;
	}
	
	/**
	 * 作用描述：数据集合
	 * @author LRC
	 * @createDate 2015年10月20日
	 * @version v1.0 
	 * @updateRecord 格式：时间，作者，修改说明
	 **
	 * 
	 */
	public class Data{
		public String id;
		public String name;
		public Integer rownum = 1;
		public String sql;
		public String dbSource;
		public String type;//数据获取方式 db  list
		public Map<String,Object> data;
		public Object get(String key){
			return data.get(key);
		}
	}
	
}
